<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            padding-bottom: 800px;
            padding-left: 30px;
        }
    </style>
</head>
<body>
    <div id="app">
        <p>
            vue3对象新增属性依然具有响应式的原因时-vue3在原有的Object.defineProperty劫持技术上，增加Proxy拦截 <br>
            Proxy 拦截的对象本身，在属性发生变化时会触发set方法【修改，删除，添加，更新】<br>
            vue3对对象新增属性时依然具有响应式特性,所以vue3删除了$set方法 <br>
            上述特性包含对数组的操作 <br>
            数组的 变更方法规则被保留 <br>
            Proxy的响应式触发，必须是对劫持变量的直接使用才会触发 <br>
        </p>
        <p>user:{{ user }}</p>
        <input type="button" value="add-user-age" @click="addUserAge()">
        <hr>
        <p>arr:{{ arr }}</p>
        <input type="button" value="set-empty-arr" @click="setArrToEmpty()"><br>
        <input type="button" value="修改数组第一个元素的值" @click="setArrFirst()"><br>
        <input type="text" v-model="arr[1]"> <br>
        <input type="button" value="addArrItem" @click="addArrItem()">
        <br>
        <p>list:{{ list }}</p>
        <input type="button" value="addContent" @click="addContent()">
    </div>
    <script type="module">
        let pushFun = Array.prototype.push
        // 加载 Vue3 的ESM 模块文件
        import { createApp } from "../assets/vue3/vue.esm-browser.js"
        createApp({
            data(){
                return {
                    user:{
                        name:"tom"
                    },
                    arr:[1,2,3,4,5,6],
                    list:[]
                }
            },
            methods: {
                addUserAge() {
                    this.user.age = 13;
                },
                setArrToEmpty(){
                    // this.arr = []
                    // Proxy 监控了数组对象的length属性变化，触发了响应式
                    this.arr.length = 0;
                },
                setArrFirst(){
                    this.arr[0] = Math.random();
                },
                addArrItem(){
                    this.arr.push( Math.random() )
                    console.log(this.arr.push === pushFun);
                },
                addContent(){
                    let arr = [
                        { a:1 },
                        { b:2 }
                    ]
                    // for (let item of arr) {
                    //     setTimeout(() => {
                    //         item.list = [1,2,3,4]
                    //     }, 1000);
                    //     // item.list = [1,2,3,4]
                    // }
                    for (let i in arr) {
                        setTimeout(() => {
                            // arr[i].list = [1,2,3,4]
                            this.list[i].list = [1,2,3,4]
                        }, 1000);
                        // item.list = [1,2,3,4]
                    }
                    this.list = arr;
                }
            }
        }).mount("#app")
    </script>
</body>
</html>